package com.acmen.easyapi.aspect;

import com.acmen.easyapi.annotation.RestApi;
import com.acmen.easyapi.model.Response;
import com.acmen.easyapi.util.DateUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @author acmen
 * 通过注解切面统计接口花费时间
 * @date 2022-07-02
 */
@Aspect
@Order(-Integer.MAX_VALUE)
@Component
public class RequestCostAspect {

    /**
     * 绕过注解执行原始方法并统计接口执行时间
     * @param joinPoint 执行连接点
     * @param restApi 注解对象
     * @return 原始方法的返回值
     * @throws Throwable 异常
     */
    @Around("@annotation(restApi)")
    public Object around(ProceedingJoinPoint joinPoint, RestApi restApi) throws Throwable {
        Date beginTime = new Date();  // 获取当前时间作为开始时间
        Response response = null;  // 创建一个Response对象，并将其初始化为null
        try {
            Object returnVal = joinPoint.proceed();  // 执行原始方法并获取返回值
            if(returnVal instanceof Response){  // 判断返回值是否为Response对象
                response = (Response)returnVal;  // 将返回值转换为Response对象并赋值给response变量
                if(response.getExtend() == null){  // 判断Response对象的extend属性是否为空
                    response.setExtend(new Response.Extend());  // 若为空，则为其创建一个新的Extend对象
                }
                response.getExtend().setBeginTime(DateUtils.parseDateToStr(beginTime,"yyyy-MM-dd HH:mm:ss.SSS"));  // 将beginTime时间转换为字符串并设置给Extend对象的beginTime属性
            }
            return returnVal;  // 返回原始方法的返回值
        }finally {
            Date endTime = new Date();  // 获取当前时间作为结束时间
            if(response != null){  // 判断response变量是否为null
                response.getExtend().setEndTime(DateUtils.parseDateToStr(endTime,"yyyy-MM-dd HH:mm:ss.SSS"));  // 将endTime时间转换为字符串并设置给Extend对象的endTime属性
                response.getExtend().setCostTime(endTime.getTime() - beginTime.getTime());  // 计算结束时间和开始时间的差值并设置给Extend对象的costTime属性
            }
        }

    }
}
